﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once
#include "GmepModelBase.h"
#include "GmepICommonConfig.h"

namespace gcmp
{
    class IDocument;
}

namespace gmep
{
    enum class VersionInfoKey : Int32
    {
        // 版本号 major.minor.subminor.revision
        Major = 0,              // 大版本
        Minor,                  // 月度版本
        SubMior,                // 文件版本(4位)
        Revision,               // 功能版本(4位)
        GcmpData,               // 文件版本中gcmpSdk的月度版本（1~2位）
        GmepData,                // 文件版本中gmep的月度版本（3~4位）
        BusinessCategory,       // 功能版本中的业务类别，如单机版、协同版等（第1位）
        BusinessType,           // 功能版本中的业务类型，如公测版、1267版等（第2位）
    };

    class GMEP_MODEL_BASE_EXPORT GmepVersionUtils
    {
    public:
        // \brief 获取程序的完整版本
        static std::wstring GetProductVersion();

        // \brief 获取程序是否为内部状态
        static bool GetProductIsInHouse();

        // \brief 按枚举类型在版本号中提取相应字段
        // \param fullVersion 版本号
        // \param key 字段枚举
        // \param format 是否进行格式化，如SubMior在版本号中为100，则按SubMior的格式左端补0格式化为0100
        static std::wstring InferVersion(const std::wstring& fullVersion, VersionInfoKey key, bool format = true);


        // \brief 在文件中写入当前程序的版本信息
        static void CreateProjectVersionFileInDocument(gcmp::IDocument* pDoc);
        // \brief 在文件中写入文档的版本和来源
        static void CreateFileVersionAndSourceInVersionFile(gcmp::IDocument* pDoc);

        // \brief 获取文件中记录的版本信息
        // \param customDataFolderPath 文件中记录版本信息文件所在的文件夹路径
        // \param version 文件中记录的版本号
        // \return 是否成功获取；老文件中无版本信息时返回true
        static bool InferVersionFromDocument(const std::wstring& customDataFolderPath, std::wstring& version);

        // \brief 获取文件中记录的来源
        // \param customDataFolderPath 文件中记录版本信息文件所在的文件夹路径
        // \return 是否成功获取；
        static bool IsFileFromCollaborationToLocal(gcmp::IDocument* pDoc);

        // \brief 将指定版本与当前产品的版本做比较(如果输入无效版本，则无效版本更老)
        // >0： 指定版本更新
        // =0： 指定版本与当前产品版本相同
        // <0： 指定版本比当前版本更老
        static int CompareToProductVersion(const std::wstring& version);

        // \brief 验证指定版本是否与当前安装的授权类型匹配
        static bool ValidateAuthorizationType(const std::wstring& version);

        // \brief 根据版本获取对应的业务类别名称
        // 该逻辑在完成版本号、业务类别、产品名称等通过配置映射后可去除
        static std::wstring GetProductBusinessCategoryName(const std::wstring& version);

        // \brief 根据配置文件获取对应的环境标记
        // 获取当前环境是公有云环境还是私有化部署
        static bool IsPrivatizationEnvironment();
    };
}

